#include <stdio.h>
#include <stdlib.h>

// 链栈的表示
typedef int SElemType;
typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
} StackNode, *LinkStack;
LinkStack S;

// 链栈的初始化--构造一个空栈，栈顶指针为空
Status InitStack(LinkStack &S)
{
    S = NULL;
    return OK;
}

// 判断链栈是否为空
Status StackEmpty(LinkStack S)
{
    if (S == NULL)
        return TRUE;
    else
        return FALSE;
}

// 链栈的入栈
Status Push(LinkStack &S, SElemType e)
{
    p = (StackNode *)malloc(sizeof(StackNode)); // 生成新结点p
    p->data = e;                                // 将新节点数据域置为e
    p->next = S;                                // 将新节点插入栈顶
    S = p;                                      // 更新栈顶指针
    return OK;
}

// 链栈的出栈
Status Pop(LinkStack &S, SElemType &e)
{
    if (S == NULL)
        return ERROR;
    e = S->data;
    StackNode *p = S; // 临时指针 p 保存当前栈顶节点
    S = S->next;      // 将栈顶指针移动到下一个节点
    free(p);          // 释放原栈顶节点的内存
    return OK;
}

// 取栈顶元素
SElemType GetTop(LinkStack S){
    if (S != NULL) return S -> data;
}